#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：pytest_allure_pytest-html_study 
@File    ：02_assert_.py
@IDE     ：PyCharm 
@Author  ：XiaoDengYa
@Date    ：2021/6/2/002 16:15 
"""

# assert小例子
# 异常信息
import pytest

"""
import pytest

def f():
    return 3

def test_function():
    a = f()
    assert a % 2 == 0, "判断 a 为偶数，当前 a 的值为：%s" % a

if __name__ == '__main__':
    pytest.main(["-v","02_assert_.py"])
    
"""

"""
pytest 里面断言实际上就是 python 里面的 assert 断言方法，常用的有以下几种
assert xx ：判断 xx 为真
assert not xx ：判断 xx 不为真
assert a in b ：判断 b 包含 a
assert a == b ：判断 a 等于 b
assert a != b ：判断 a 不等于 b
"""

# 异常断言
# 可以使用 pytest.raises 作为上下文管理器，当抛出异常时可以获取到对应的异常实例
# 如果知道断言会出现什么异常则可以使用pytest.raises（通常用来判断异常与你预期是否一致）
"""
def test_zero_division():
    with pytest.raises(ZeroDivisionError) as excinfo:
        1 / 0
        # 断言异常类型 type
        assert excinfo.type == ZeroDivisionError
        # 断言异常 value 值
        assert "division by zero" in str(excinfo.value)

# 自定义消息
def test_zero_division_long():
    with pytest.raises(ZeroDivisionError, match=".*zero.*") as excinfo:
        1 / 0


def test_demo():
    with pytest.raises(AssertionError)as e:
        assert 1 == 2
"""

# 拓展一：match
# 可以将 match 关键字参数传递给上下文管理器，以测试正则表达式与异常的字符串表示形式是否匹配
# 注意：这种方法只能断言value，不能断言type

# 自定义消息
# def test_zero_division_long():
#     with pytest.raises(ZeroDivisionError, match=".*zero.*") as excinfo:
#         1 / 0


# 拓展二：检查断言装饰器

# 断言装饰器
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_f():
    1 / 0


#知识点
# 代码抛出异常，但是和raises指定的异常类相匹配，所以不会断言失败
# 它相当于一个检查异常装饰器，功能：检查是否有异常，不确定是否有异常
# with pytest.raise(ZeroDivisionError)  对于故意测试异常代码的情况，使用可能会更好
# 而@pytest.mark.xfail(raises=ZeroDivisionError) 对于检查未修复的错误（即，可能会发生异常），使用检查断言可能会更好